package meow

/** つぶやき  */
class Status implements Serializable {
  static searchable = {
    only = ['message']
    // dateCraetedは検索結果に含めるけど検索対象にはしない
    dateCreated index:'not_analyzed', excludeFromAll:true
    // accountをeager fetchするために，reference属性を与える
    account reference:true
  }
  static belongsTo = [account: Account]
  String message
  Date dateCreated

  static constraints = {
    message blank: true, maxSize: 140
  }

  /** メッセージの宛先：Set   */
  def replies() {
    def set = [] as Set
    // 一応，Accountの条件 [0-9a-zA-Z_] で 20文字以内 にあわせる
    (message =~ /@([0-9a-zA-Z_]{1,20}+)( |$)/).each {m0, m1, m2 ->
      // AccountのNGリストに含まれているのは除外する
      if (!Account.ngLists.contains(m1)) set << m1
    }
    return set
  }

  static totalCount(username) {
    withCriteria {
      projections { rowCount() }
      account { eq 'username', username }
    }[0]
  }
}
